package work4;

import java.io.*;
import java.util.List;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *
 *使用线程池将一个目录中的所有内容拷贝到另外一个目录中，包含子目录中的内容。
 *
 *
 * */
public class Test3 {
    public static void main(String args[]){
        //定义一个线程池
        ExecutorService service = Executors.newFixedThreadPool(10);


        //copy(new File("F:\\test\\1.txt"),new File("F:\\test\\2.txt"));
        copyAll(new File("F:\\test"),new File("F:\\test1"),service);
    }
    //获取一个目录下的所有文件
    public List<File> getFileList(File file){
        return null;
    }

    //拷贝单个文件的方法
    public static void copy(File fromFile,File toFile){
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            System.out.println(fromFile.getName() + "开始拷贝");
            //将两个文件与输入输出流绑定
            FileInputStream inputStream = new FileInputStream(fromFile);
            FileOutputStream outputStream = new FileOutputStream(toFile);
             bis = new BufferedInputStream(inputStream);
             bos = new BufferedOutputStream(outputStream);


            byte[] b = new byte[1024];
            int res = 0;
            while ((res = bis.read(b)) != -1) {
                bos.write(b, 0, res);
            }
            System.out.println(fromFile.getName() + "拷贝成功");
        }  catch (IOException e) {
            System.out.println(fromFile.getName() + "拷贝失败");
            e.printStackTrace();
        } finally {
            try {
            if (null != bis) {
                bis.close();
                bis = null;
            }
            if (null != bos){
                bos.close();
                bos = null;
            }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //拷贝所有文件
    public static void copyAll(File fromFile,File toFile,ExecutorService service){
            //先获取被拷贝目录下的文件列表
            File files[] = fromFile.listFiles();
            for (int i = 0; i < files.length; i++) {
                File file = files[i];
                //获取单个文件路径
                String path = file.getAbsolutePath();
                //文件名称一样，替换一下前面父目录的名称
                String copyPath = path.replace(fromFile.getPath(),toFile.getPath());
                File copyFile = new File(copyPath);
                //如果是文件夹则还需要再一次调用该方法
                if (file.isDirectory()){

                    //创建当前文件夹
                    copyFile.mkdirs();
                    copyAll(file,copyFile,service);
                 //如果是文件则直接拷贝
                } else {
                    service.execute(new Runnable() {
                        @Override
                        public void run() {
                            copy(file,copyFile);
                        }
                    });
                }
            }


    }
}
